ReverseV2
对输入Tensor按指定维度反转。
- 输入:
src - 需反转数据的地址
param - 算子计算所需参数的结构体。其各成员见下述。
core_mask - 核掩码。
ReverseV2Parameter定义:
1typedef struct ReverseV2Parameter {
2 int* axis_flag_; // 用于存储需反转的轴,需反转的轴对应于数组索引的元素被置为1,其余元素为0
3 int* input_shape_; // 输入张量的形状
4 int* input_strides_; // 一个记录输入张量每一维步长的数组
5 int** cur_coord_; // 二维数组,每个元素存储对应核心所使用的cur_coord数组地址,这个数组用于记录当前循环到的元素坐标
6 int ndim_; // 输入和输出张量的维度
7 int axis_ndim_; // 需反转的轴的数目
8 int num_elem_; // 元素总数
9 int type_size_; // 输入和输出张量数据类型的长度
10} ReverseV2Parameter;
- 输出:
dst - 输出地址。
- 支持平台:
FT78NEMT7004
备注
FT78NE 支持int8, int16, int32, fp32, fp64, cplx64, cplx128
MT7004 支持fp16, fp32, int16, int32, cplx64
共享/私有存储版本:
-
void anytype_reversev2_anycore(void *src, void *dst, ReverseV2Parameter *param, int core_mask)
各种数据类型、私有及共享空间版本均使用该函数。对于不同数据类型,改变param中的type_size_参数即可。
C调用示例:
1void Resize(ReverseV2Parameter* param, int* axis) {
2 int i;
3 param->input_strides_[param->ndim_ - 1] = 1;
4 for (i = param->ndim_ - 1; i > 0; i--) {
5 param->input_strides_[i - 1] = param->input_strides_[i] * param->input_shape_[i];
6 }
7 for (i = 0; i < param->ndim_; i++) {
8 // initialize axis_flag array by 0
9 param->axis_flag_[i] = 0;
10 }
11 for (i = 0; i < param->axis_ndim_; i++) {
12 param->axis_flag_[axis[i]] = 1;
13 }
14 param->num_elem_ = 1;
15 for (i = 0; i < param->ndim_; i++) {
16 param->num_elem_ *= param->input_shape_[i];
17 }
18}
19
20void TestReverseV2(int* shape, int ndim, int* axis, int axis_ndim, int core_mask) {
21 int type_size = 4;
22 int core_num = GetCoreNum(core_mask);
23 int core_id = get_core_id();
24 int logic_core_id = GetLogicCoreId(core_mask, core_id);
25 float* input_data = (float*)0x88000000; // 测试私有空间时地址设置在私有空间内即可
26 float* output_data = (float*)0xA8000000;
27 float* check = (float*)0xC8000000;
28 ReverseV2Parameter* param = (ReverseV2Parameter*)0x84000000;
29 if (logic_core_id == 0) {
30 int i, j;
31 param->axis_ndim_ = axis_ndim;
32 param->input_shape_ = (int*)0x84003000;
33 for (i = 0; i < ndim; i++) {
34 param->input_shape_[i] = shape[i];
35 }
36 param->ndim_ = ndim;
37 param->type_size_ = type_size;
38 param->input_strides_ = (int*)0x84004000;
39 param->axis_flag_ = (int*)0x84005000;
40 param->cur_coord_ = (int**)0x84006000;
41 for (i = 0; i < 4; i++) {
42 param->cur_coord_[i] = (int*)(0x84007000 + i * 0x1000LL);
43 for (j = 0; j < ndim; j++) {
44 param->cur_coord_[i][j] = 0;
45 }
46 }
47 Resize(param, axis);
48 }
49 sys_bar(0, core_num); // 初始化参数完成后进行同步
50 anytype_reversev2_anycore(input_data, output_data, param, core_mask);
51}
52
53void main(){
54 int shape[3] = {10, 10, 1000};
55 int ndim = 3;
56 int axis[3] = {0, 1, 2};
57 int axis_ndim = 3;
58 int core_mask = 0b1111;
59 TestReverseV2(shape, ndim, axis, axis_ndim, core_mask);
60}